#[cfg(test)]
pub mod test_map {
    use std::collections::HashMap;

    #[test]
    pub fn map01() {
        /*
        HashMap 和所有权
        ·对于实现了Copy trait的类型(例如i32)，值会被复制到HashMap 中
        ·对于拥有所有权的值(例如String)，值会被移动，所有权会转移给HashMap
        ·如果将值的引用插入到HashMap，值本身不会移动 
            - 在 HashMap 有效的期间，被引用的值必须保持有效
         */

        /*
        Hash 函数
        ·默认情况下，HashMap使用加密功能强大的Hash函数，可以抵抗拒绝服务(DoS)攻击。
            - 不是可用的最快的Hash 算法 
            - 但具有更好安全性。
        ·可以指定不同的hasher来切换到另一个函数。 
            - hasher是实现BuildHasher trait的类型
         */

        let mut map1: HashMap<String, i32> = HashMap::new(); 
        let k1 = String::from("key0");
        map1.insert(k1.clone(), 0);
        map1.insert(String::from("key1"), 1);

        let v1 = map1.get(&k1);
        match v1 {
            Some(getv) => println!("{} = {}", k1, getv), 
            None=> println!("key {} is not exist.", k1),
        }

        for (k,v) in &map1 {
            println!("{}: {}", k, v);
        }
        
        // entry 校验值是否存在
        let en = map1.entry(String::from("key2"));
        println!("en = {:?}", en);

        // or_insert: 如果不存在才插入， 返回到这个值的可变引用
        en.or_insert(2);

        println!("en2 = {:?}", map1.entry(String::from("key2")));

        map1.entry(String::from("key3")).or_insert(3);
        
        map1.entry(String::from("key1")).or_insert(3);

        println!("map1 = {:?}", map1);



    }

    #[test]
    pub fn map02() {
        let keys: Vec<i32> = vec![1, 2];
        let vals = vec![String::from("value1"), String::from("val2")];
        let map: HashMap<_, _> = keys.iter().zip(vals.iter()).collect();
    }

    #[test]
    pub fn map03() {
        let text = "welcom to ly`s world";
        let mut map = HashMap::new();
        for w in text.split_whitespace() {
            let count = map.entry(w).or_insert(0);
            *count += 1;
        }

        println!("map = {:#?}", map);
    }
}